package cn.kent.simple;

/**
 * 191. 位1的个数
 */
public class HammingWeight {
    public static void main(String[] args) {
        hammingWeight1(8);
    }

    /**
     * 位运算优化
     * n & (n−1)，其运算结果恰为把 n 的二进制位中的最低位的 1 变为 0 之后的结果。
     * 可以验证, 6->4
     */
    public static int hammingWeight2(int n) {
        int ret = 0;
        while (n != 0) {
            n &= (n - 1); // --> n &= n - 1;
            ret++;
        }
        return ret;
    }


    /**
     * 循环检查二进制位
     * 直接循环检查给定整数 n 的二进制位的每一位是否为 1。
     */
    public static int hammingWeight1(int n) {
        int sum = 0;
        for (int i = 0; i < 32; i++) {
            if ((n & (1 << i)) != 0) {
                sum++;
            }
        }
        return sum;
    }

    /**
     * 先转为二进制字符串, 然后遍历字符串的每一位是否是1
     */
    public int hammingWeight(int n) {
        int sum = 0;
        String s = Integer.toUnsignedString(n, 2);
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == '1') {
                sum++;
            }
        }
        return sum;
    }
}
